"""
在柠檬水摊上，每一杯柠檬水的售价为 5 美元。

顾客排队购买你的产品，（按账单 bills 支付的顺序）一次购买一杯。

每位顾客只买一杯柠檬水，然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零，也就是说净交易是每位顾客向你支付 5 美元。

注意，一开始你手头没有任何零钱。

如果你能给每位顾客正确找零，返回 true ，否则返回 false 。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/lemonade-change
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
"""

"""
找零的时候优先给大面额的钱
"""
from typing import List
class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        dic = {5:0, 10:0, 20:0}
        for bill in bills:
            if bill == 5:
                dic[5] += 1
            elif bill == 10:
                dic[10] += 1
                if dic[5] > 0:
                    dic[5] -= 1
                else:
                    return False
            elif bill == 20:
                # 优先给10元
                if dic[10] > 0:
                    dic[10] -= 1
                    if dic[5] > 0:
                        dic[5] -= 1
                    else:
                        return False
                else:
                    if dic[5] >= 3:
                        dic[5] -= 3
                    else:
                        return False
            else:
                raise ValueError
        return True

def test():
    assert Solution().lemonadeChange([10, 10]) == False
    assert Solution().lemonadeChange([5,5,5,10,20])
    assert Solution().lemonadeChange([5,5,5,5,20,20,5,5,20,5]) == False